package cn.arnold.linkedlist;


// 单链表类
public class SingleLinkedList {

    // 头结点
    private HeroNode headNode = new HeroNode(0, "", "");

    public HeroNode getHeadNode() {
        return headNode;
    }

    public void setHeadNode(HeroNode headNode) {
        this.headNode = headNode;
    }

    // 添加节点到链表尾部:next为null
    public void addNode(HeroNode heroNode) {
        // 临时变量
        HeroNode temp = headNode;
        // 遍历：找到尾部元素
        // 结束条件：temp.next==null
        while (true) {
            if (temp.getNext() == null) {
                break;
            }
            // 没有找到，则temp后移
            temp = temp.getNext();
        }
        // 添加节点
        temp.setNext(heroNode);
    }

    // 按编号顺序添加到链表尾部
    public void addNodeByOrder(HeroNode heroNode) {
        // 找到要插入节点的前一个位置插入
        // 临时变量
        HeroNode temp = headNode;
        boolean flag = false; // 是否已经存在要插入的编号
        while (true) {
            if (temp.getNext() == null) {
                break;
            }
            if (temp.getNext().getNum() > heroNode.getNum()) { // 找到要插入的位置
                break;
            } else if (temp.getNext().getNum() == heroNode.getNum()) { //已经存在要插入的编号
                System.out.println("表中已存在该元素");
                flag = true;
                break;
            }
            // temp后移
            temp = temp.getNext();
        }
        // 添加节点
        if (flag) {
            System.out.printf("准备添加的英雄编号%d已经存在了，不能添加", heroNode.getNum());
        } else {
            heroNode.setNext(temp);
            temp.setNext(heroNode);
        }

    }

    // 修改
    public void update(HeroNode heroNode) {
        // 判断是否为空
        if (headNode.getNext() == null) {
            System.out.println("链表为空");
            return;
        }
        // 找到要修改的节点：根据编号
        HeroNode temp = headNode.getNext();
        boolean flag = false;
        while (true) {
            if (temp == null) {
                break;
            }
            if (temp.getNum() == heroNode.getNum()) {
                flag = true;
                break;
            }
            // 后移
            temp = temp.getNext();
        }
        // 修改
        if (flag) {
            temp.setName(heroNode.getName());
            temp.setNickname(heroNode.getNickname());
        } else {
            System.out.printf("没有找到英雄编号%d的英雄，不能修改", heroNode.getNum());
        }
    }

    // 删除
    public void delete(HeroNode heroNode) {
        HeroNode temp = headNode;
        boolean flag = false;
        while (true) {
            if (temp.getNext() == null) {
                break;
            }
            if (temp.getNext().getNum() == heroNode.getNum()) {
                flag = true;
                break;
            }
            temp = temp.getNext();
        }
        // 删除：temp.next=temp.next.next
        if (flag) {
            temp.setNext(temp.getNext().getNext());
        } else {
            System.out.printf("没有找到英雄编号%d的英雄，不能删除", heroNode.getNum());
        }
    }

    // 遍历显示链表
    public void showList() {
        // 判断是否为空
        if (headNode.getNext() == null) {
            System.out.println("链表为空");
            return;
        }
        // 临时变量
        HeroNode temp = headNode.getNext();
        // 遍历：找到尾部元素
        // 结束条件：temp.next==null
        while (true) {
            if (temp == null) {
                break;
            }
            // 打印
            System.out.println(temp);
            // temp后移
            temp = temp.getNext();
        }
    }

    // 有效节点的个数
    public int getSize(HeroNode head) {
        if (head.getNext() == null) {
            return 0;
        }
        int count = 0;
        HeroNode cur = head.getNext();
        while (cur != null) {
            count++;
            cur = cur.getNext(); //遍历
        }
        return count;
    }
}
